Sudoku Solver

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

Sudoku Solver - 图1

A sudoku puzzle…

Sudoku Solver - 图2

…and its solution numbers marked in red.

Solution:

  1. public class Solution {
  2. public void solveSudoku(char[][] board) {
  3. if (board == null || board.length != 9 || board[0].length != 9) {
  4. return;
  5. }
  6. solve(board, 0, 0);
  7. }
  8. private boolean solve(char[][] board, int i, int j) {
  9. if (j == 9) {
  10. return solve(board, i + 1, 0);
  11. }
  12. if (i == 9) {
  13. return true;
  14. }
  15. if (board[i][j] != '.') {
  16. return solve(board, i, j + 1);
  17. }
  18. // try 1 - 9
  19. for (int k = 1; k <= 9; k++) {
  20. board[i][j] = (char)('0' + k);
  21. if (check(board, i, j)) {
  22. if (solve(board, i, j + 1)) {
  23. return true;
  24. }
  25. }
  26. board[i][j] = '.';
  27. }
  28. return false;
  29. }
  30. private boolean check(char[][] board, int i, int j) {
  31. // check row i
  32. for (int k = 0; k < 9; k++) {
  33. if (k != j && board[i][k] == board[i][j]) {
  34. return false;
  35. }
  36. }
  37. // check column j
  38. for (int k = 0; k < 9; k++) {
  39. if (k != i && board[k][j] == board[i][j]) {
  40. return false;
  41. }
  42. }
  43. // check grid
  44. int row = i/3 * 3;
  45. int col = j/3 * 3;
  46. for (int r = row; r < row + 3; r++) {
  47. for (int c = col; c < col + 3; c++) {
  48. if (r != i && c != j && board[r][c] == board[i][j]) {
  49. return false;
  50. }
  51. }
  52. }
  53. return true;
  54. }
  55. }